"""
Checksum Algorithms

实现雷达通信中的校验算法
"""

import struct
from typing import Union


class Checksum:
    """校验算法类"""

    @staticmethod
    def crc16(data: bytes) -> bytes:
        """
        计算CRC16校验值

        Args:
            data: 要校验的数据

        Returns:
            2字节CRC16校验值（大端序）
        """
        crc = 0x0000
        polynomial = 0x1021

        for byte in data:
            crc ^= (byte << 8)
            for _ in range(8):
                if crc & 0x8000:
                    crc = (crc << 1) ^ polynomial
                else:
                    crc <<= 1
                crc &= 0xFFFF

        return struct.pack('>H', crc)

    @staticmethod
    def xor_checksum(data: bytes) -> bytes:
        """
        计算XOR校验值

        Args:
            data: 要校验的数据

        Returns:
            1字节XOR校验值
        """
        checksum = 0
        for byte in data:
            checksum ^= byte
        return bytes([checksum])

    @staticmethod
    def verify_crc16(data: bytes, checksum: bytes) -> bool:
        """
        验证CRC16校验

        Args:
            data: 数据
            checksum: 校验值

        Returns:
            验证结果
        """
        return Checksum.crc16(data) == checksum

    @staticmethod
    def verify_xor(data: bytes, checksum: bytes) -> bool:
        """
        验证XOR校验

        Args:
            data: 数据
            checksum: 校验值

        Returns:
            验证结果
        """
        return Checksum.xor_checksum(data) == checksum